水無瀬の部屋 > Programming > sample > goddess > instdlg.cpp |
---|
1: //*********************************************************
2: // プロジェクト: ああっ壁神さまっ
3: // ファイル名: instdlg.cpp
4: //*********************************************************
5: #include "instdlg.h" //
6: #include "install.h" //
7: #include "res.h" //
8: #include <misc/atoffset.h>
9: #include <header/myweburl.h> //
10: #include <dlg/aboutbox/aboutbox.h> //
11:
12:
13: //---------------------------------------------------------
14: // テスト関数 の 宣言
15: //---------------------------------------------------------
16: DECLARE_TESTPROC( test_InstallDlg );
17:
18:
19: //---------------------------------------------------------
20: // ファイルスコープ関数 の 宣言
21: //---------------------------------------------------------
22: static bool InitInstallDlgControls( HWND hWnd, DWORD more );
23: static bool SetInstallDlgData( HWND hWnd, const install_t *info );
24: static bool GetInstallDlgData( HWND hWnd, install_t *info );
25: static bool EnableDlgItemGroup( HWND hWnd, id_t id, bool bEnable );
26: static bool ShowDlgItemGroup( HWND hWnd, id_t id, bool bShow );
27: static bool InitInstallDlgSystemMenu( HWND hWnd );
28: static INT_PTR CALLBACK InstallDlgProc( HWND, UINT, WPARAM, LPARAM );
29:
30:
31: //---------------------------------------------------------
32: // ファイルスコープ変数 の 定義
33: //---------------------------------------------------------
34: //
35: static struct g_dlg_tag
36: {
37: // bool ico;
38: DWORD more;
39: RECT rcClient;
40: SIZE szMinSize;
41: install_t info;
42: } g_dlg;
43:
44: //
45: static const struct g_ddx_tag
46: {
47: id_t id;
48: DWORD flag;
49: int check;
50: int more;
51: // int reg;
52: // int reg_title;
53: int menu;
54: int menu_title;
55: int cmdline;
56: int cmdline_title;
57: int group;
58: }
59: g_ddx[] =
60: {
61: #define MAKE_DDX( name ) { ID_ ## name, INSTALL_ ## name, IDC_ ## name, IDC_MORE_ ## name, IDC_MENUTITLE_ ## name, IDC_STATIC_MENUTITLE_ ## name, IDC_CMDLINE_ ## name, IDC_STATIC_CMDLINE_ ## name, IDC_GROUP_ ## name }
62: MAKE_DDX( CENTER ),
63: MAKE_DDX( TILE ),
64: MAKE_DDX( ZOOM ),
65: #undef MAKE_DDX
66: };
67: COMPILE_ASSERT( numof(g_ddx) == numof( ((install_t *)null)->reg ) );
68:
69: // 各コントロールIDへのアクセス
70: static const size_t g_offset[] =
71: {
72: #define DDX_MEMBER_OFFSET( member ) offsetof( struct g_ddx_tag, member )
73: DDX_MEMBER_OFFSET( check ),
74: DDX_MEMBER_OFFSET( more ),
75: // DDX_MEMBER_OFFSET( reg ),
76: // DDX_MEMBER_OFFSET( reg_title ),
77: DDX_MEMBER_OFFSET( menu ),
78: DDX_MEMBER_OFFSET( menu_title ),
79: DDX_MEMBER_OFFSET( cmdline ),
80: DDX_MEMBER_OFFSET( cmdline_title ),
81: DDX_MEMBER_OFFSET( group ),
82: #undef DDX_MEMBER_OFFSET
83: };
84:
85:
86: //*********************************************************
87: // InstallDlg
88: // アプリケーションを拡張子に関連づける
89: //*********************************************************
90: bool
91: InstallDlg
92: (
93: HWND hwndOwner
94: )
95: {
96: CALLONCE_TESTPROC( test_InstallDlg ); // [テスト]
97:
98: // パラメタの仮定
99: ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
100:
101: HINSTANCE hInstance = GetModuleHandle( null );
102: const INT_PTR result = DialogBoxParam
103: (
104: hInstance,
105: MAKEINTRESOURCE( INSTALL_BOX ),
106: hwndOwner,
107: InstallDlgProc,
108: null
109: );
110: return IDOK == result;
111: }//InstallDlg
112:
113:
114: //******************************************************************************************************************
115: //
116: //******************************************************************************************************************
117: static INT_PTR OnInstallInitDialog( HWND hWnd, WPARAM wParam, LPARAM lParam );
118: static INT_PTR OnInstallDestroy( HWND hWnd );
119: static INT_PTR OnInstallCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
120: static INT_PTR OnInstallSystemCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
121: static INT_PTR OnInstallHitTest( HWND hWnd, WPARAM wParam, LPARAM lParam );
122: static INT_PTR OnInstallGetMinMaxInfo( HWND hWnd, LPARAM lParam );
123: static INT_PTR OnInstallSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
124:
125:
126: //*********************************************************
127: // InstallDlgProc
128: //*********************************************************
129: static
130: INT_PTR
131: CALLBACK
132: InstallDlgProc
133: (
134: HWND hWnd,
135: UINT uMsg,
136: WPARAM wParam,
137: LPARAM lParam
138: )
139: {
140: // パラメタの仮定
141: ASSERT( IsValidWindow( hWnd ) );
142:
143: switch( uMsg )
144: {
145: case WM_DESTROY: return OnInstallDestroy( hWnd );
146: case WM_NCHITTEST: return OnInstallHitTest( hWnd, wParam, lParam );
147: case WM_INITDIALOG: return OnInstallInitDialog( hWnd, wParam, lParam );
148: case WM_COMMAND: return OnInstallCommand( hWnd, wParam, lParam );
149: case WM_SYSCOMMAND: return OnInstallSystemCommand( hWnd, wParam, lParam );
150: case WM_GETMINMAXINFO: return OnInstallGetMinMaxInfo( hWnd, lParam );
151: case WM_SIZE: return OnInstallSize( hWnd, wParam, lParam );
152: default: return false;
153: }
154: }//InstallDlgProc
155:
156: //*********************************************************
157: // OnInstallInitDialog - WM_INITDIALOG
158: // ダイアログが作成された。
159: // この関数が抜けるまでダイアログは表示されない。
160: // 明示的にフォーカスを移動した場合は 真 を返せ。
161: // さもなくば 偽 を返せ。
162: // HWND wParam …… フォーカスを受け取る予定のコントロール
163: // LPARAM lParam …… ダイアログの初期化パラメタ
164: //*********************************************************
165: static
166: INT_PTR
167: OnInstallInitDialog
168: (
169: HWND hWnd,
170: WPARAM _unuse( wParam ),
171: LPARAM _unuse( lParam )
172: )
173: {
174: // パラメタの仮定
175: ASSERT( IsValidWindow( hWnd ) );
176: ASSERT( IsValidInitDialogMessageParam( wParam, lParam ) );
177:
178: // ダイアログ の 初期化
179: {
180: HINSTANCE hInstance = GetModuleHandle( null );
181: HICON hIcon = SHGetInstanceIcon( hInstance, SHGFI_LARGEICON );
182: HICON hIconSm = SHGetInstanceIcon( hInstance, SHGFI_SMALLICON );
183: SetWindowIcon( hWnd, ICON_BIG, hIcon ); // 大きいアイコン
184: SetWindowIcon( hWnd, ICON_SMALL, hIconSm ); // 小さいアイコン
185: VERIFY( WindowMoveToCursorPos( hWnd ) );
186:
187: // ダイアログ情報 g_dlg の 初期化
188: {
189: //
190: VERIFY( GetClientRect( hWnd, &g_dlg.rcClient ) );
191: VERIFY( GetWindowSize( hWnd, &g_dlg.szMinSize ) );
192:
193: //
194: VERIFY( LoadInstallInfo( &g_dlg.info ) );
195:
196: // 全ての詳細を隠す
197: g_dlg.more = 0;
198:
199: //
200: // g_dlg.ico = (FLAG_TILE == (FLAG_TILE & g_dlg.info.flags));
201: }
202: }
203:
204: // システムメニュー の 初期化
205: VERIFY( InitInstallDlgSystemMenu( hWnd ) );
206:
207: // コントロール の 初期化
208: VERIFY( InitInstallDlgControls( hWnd, g_dlg.more ) );
209:
210: // コントロール値 の 設定
211: VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
212:
213: return false;
214: }//OnInstallInitDialog
215:
216: //*********************************************************
217: // OnInstallDestroy - WM_DESTROY
218: // まもなくウィンドウが破棄される。
219: // ウィンドウに関連付けた独自リソースを破棄する。
220: // 常に 真 を返す。
221: //*********************************************************
222: static
223: INT_PTR
224: OnInstallDestroy
225: (
226: HWND _unuse( hWnd )
227: )
228: {
229: // パラメタの仮定
230: ASSERT( IsValidWindow( hWnd ) );
231:
232: return true;
233: }//OnInstallDestroy
234:
235: //*********************************************************
236: // OnInstallHitTest - WM_NCHITTEST
237: // カーソル・イベントがあるたびに呼び出される。
238: // カーソルが存在する位置を示す値を返す。
239: // GET_X_LPARAM( lParam ) …… カーソルのスクリーン x 座標
240: // GET_Y_LPARAM( lParam ) …… カーソルのスクリーン y 座標
241: //*********************************************************
242: static
243: INT_PTR
244: OnInstallHitTest
245: (
246: HWND hWnd,
247: WPARAM wParam,
248: LPARAM lParam
249: )
250: {
251: // パラメタの仮定
252: ASSERT( IsValidWindow( hWnd ) );
253:
254: // サイズ変更矢印の変換ルール一覧
255: const struct { LRESULT from; LRESULT to; } trans[] =
256: {
257: { HTCLIENT, HTCAPTION }, // クライアント領域を掴んで移動可能に
258: { HTTOP, HTBORDER }, // 上端の縦矢印 → 矢印なし
259: { HTBOTTOM, HTBORDER }, // 下端の縦矢印 → 矢印なし
260: { HTTOPLEFT, HTLEFT }, // 左上隅の斜め矢印 → 左右矢印
261: { HTTOPRIGHT, HTRIGHT }, // 右上隅の斜め矢印 → 左右矢印
262: { HTBOTTOMLEFT, HTLEFT }, // 左下隅の斜め矢印 → 左右矢印
263: { HTBOTTOMRIGHT, HTRIGHT }, // 右下隅の斜め矢印 → 左右矢印
264: };
265: // 変換一覧にあれば変換した値を返す
266: const LRESULT lResult = DefWindowProc( hWnd, WM_NCHITTEST, wParam, lParam );
267: {for( int i = 0; i < numof( trans ); ++i )
268: {
269: if ( lResult == trans[ i ].from )
270: {
271: SetWindowLongPtr64( hWnd, DWL_MSGRESULT, trans[ i ].to );
272: return true;
273: }
274: }}
275:
276: return false;
277: }//OnInstallHitTest
278:
279: //*********************************************************
280: // OnInstallGetMinMaxInfo
281: //*********************************************************
282: static
283: INT_PTR
284: OnInstallGetMinMaxInfo
285: (
286: HWND hWnd,
287: LPARAM lParam
288: )
289: {
290: // パラメタの仮定
291: ASSERT( IsValidWindow( hWnd ) );
292: ASSERT( IsValidPtr( (MINMAXINFO *)lParam, sizeof(MINMAXINFO) ) );
293:
294: //
295: MINMAXINFO *pmmi = (MINMAXINFO *)lParam;
296:
297: //
298: pmmi->ptMinTrackSize.y = g_dlg.szMinSize.cy;
299: pmmi->ptMaxTrackSize.y = g_dlg.szMinSize.cy;
300:
301: //
302: pmmi->ptMinTrackSize.x = ((0 != g_dlg.more) ? 2 : 1) * g_dlg.szMinSize.cx;
303:
304: //
305: if ( 0 == g_dlg.more )
306: {
307: pmmi->ptMaxTrackSize.x = g_dlg.szMinSize.cx;
308: }
309:
310: return true;
311: }//OnInstallGetMinMaxInfo
312:
313: //*********************************************************
314: // OnInstallSize
315: //*********************************************************
316: static
317: INT_PTR
318: OnInstallSize
319: (
320: HWND hWnd,
321: WPARAM wParam,
322: LPARAM lParam
323: )
324: {
325: // パラメタの仮定
326: ASSERT( IsValidWindow( hWnd ) );
327:
328: // 最小化時は無視
329: if ( SIZE_MINIMIZED == wParam )
330: return true;
331:
332: // 移動とサイズ変更のリスト
333: const struct
334: {
335: int nID;
336: bool pos_x;
337: bool pos_y;
338: bool size_x;
339: bool size_y;
340: }
341: ctrl[] =
342: {
343: // { IDC_CENTER, false, false, false, false },
344: { IDC_MORE_CENTER, true, false, false, false },
345: // { IDC_REGPATH_CENTER, false, false, true, false },
346: { IDC_MENUTITLE_CENTER, false, false, true, false },
347: { IDC_CMDLINE_CENTER, false, false, true, false },
348: { IDC_GROUP_CENTER, false, false, true, false },
349:
350: // { IDC_TILE, false, false, false, false },
351: { IDC_MORE_TILE, true, false, false, false },
352: // { IDC_REGPATH_TILE, false, false, true, false },
353: { IDC_MENUTITLE_TILE, false, false, true, false },
354: { IDC_CMDLINE_TILE, false, false, true, false },
355: { IDC_GROUP_TILE, false, false, true, false },
356:
357: // { IDC_ZOOM, false, false, false, false },
358: { IDC_MORE_ZOOM, true, false, false, false },
359: // { IDC_REGPATH_ZOOM, false, false, true, false },
360: { IDC_MENUTITLE_ZOOM, false, false, true, false },
361: { IDC_CMDLINE_ZOOM, false, false, true, false },
362: { IDC_GROUP_ZOOM, false, false, true, false },
363:
364: { IDOK, true, false, false, false },
365: { IDCANCEL, true, false, false, false }
366: };
367: HDWP hdwp = BeginDeferWindowPos( numof(ctrl) );
368: if ( hdwp )
369: {
370: const int width = LOWORD(lParam);
371: const int height = HIWORD(lParam);
372: const int shift_x = width - g_dlg.rcClient.right;
373: const int shift_y = height - g_dlg.rcClient.bottom;
374: {for( int i = 0; i < numof(ctrl); ++i )
375: {
376: ASSERT( IsValidDlgItem( hWnd, ctrl[ i ].nID ) );
377: VERIFY( ShiftDeferDlgItem
378: (
379: &hdwp,
380: hWnd,
381: ctrl[i].nID,
382: ctrl[i].pos_x ? shift_x : 0,
383: ctrl[i].pos_y ? shift_y : 0,
384: ctrl[i].size_x ? shift_x : 0,
385: ctrl[i].size_y ? shift_y : 0
386: ) );
387: }}
388: VERIFY( EndDeferWindowPos( hdwp ) );
389:
390: g_dlg.rcClient.right = width;
391: g_dlg.rcClient.bottom = height;
392: }
393: return true;
394: }//OnInstallSize
395:
396:
397: //******************************************************************************************************************
398: // OnInstallCommand - WM_COMMAND
399: //******************************************************************************************************************
400: static INT_PTR OnInstallCommandOK( HWND hWnd );
401: static INT_PTR OnInstallCommandCancel( HWND hWnd );
402: static INT_PTR OnInstallCommandDefault( HWND hWnd, WPARAM wParam );
403: static INT_PTR OnInstallCommandCheck( HWND hWnd, WPARAM wParam );
404: static INT_PTR OnInstallCommandMore( HWND hWnd, WPARAM wParam );
405:
406:
407: //*********************************************************
408: // OnInstallCommand - WM_COMMAND
409: // コマンド項目が選択された。
410: // 返値の意味は要求されたコマンド項目による。
411: // LOWORD(wParam) …… 選択されたコマンド項目の識別子。
412: // メニューの区切り線が選択された場合は 0 が設定される。
413: // HIWORD(wParam) …… 通知コード。
414: // メッセージが メニュー から送信された場合は 0 が設定される。
415: // メッセージがアクセラレータから送信された場合は 1 が設定される。
416: // HWND lParam …… メッセージがコントロールから送信された場合はメッセージを送信したコントロールのハンドル。
417: //
418: //*********************************************************
419: static
420: INT_PTR
421: OnInstallCommand
422: (
423: HWND hWnd,
424: WPARAM wParam,
425: LPARAM _unuse( lParam )
426: )
427: {
428: // パラメタの仮定
429: ASSERT( IsValidWindow( hWnd ) );
430: ASSERT( IsValidCommandMessageParam( wParam, lParam ) );
431:
432: switch( LOWORD( wParam ) )
433: {
434: case IDOK: return OnInstallCommandOK( hWnd );
435: case IDCANCEL: return OnInstallCommandCancel( hWnd );
436: default: return OnInstallCommandDefault( hWnd, wParam );
437: }
438: }//OnInstallCommand
439:
440: //*********************************************************
441: // OnInstallCommandOK
442: //*********************************************************
443: static
444: INT_PTR
445: OnInstallCommandOK
446: (
447: HWND hWnd
448: )
449: {
450: // パラメタの仮定
451: ASSERT( IsValidWindow( hWnd ) );
452:
453: //
454: install_t info; // 設定値
455: if ( ! GetInstallDlgData( hWnd, &info ) )
456: {
457: return false;
458: }
459: ASSERT( IsValidInstallInfo( &info ) );
460:
461: // 関連づけ
462: const DWORD modified = GetModifiedFlags( &info, &g_dlg.info );
463: VERIFY( SaveInstallInfo( &info, modified ) );
464:
465: //
466: VERIFY( EndDialog( hWnd, IDOK ) );
467:
468: return true;
469: }//OnInstallCommandOK
470:
471: //*********************************************************
472: // OnInstallCommandCancel
473: //*********************************************************
474: static
475: INT_PTR
476: OnInstallCommandCancel
477: (
478: HWND hWnd
479: )
480: {
481: // パラメタの仮定
482: ASSERT( IsValidWindow( hWnd ) );
483:
484: VERIFY( EndDialog( hWnd, IDCANCEL ) );
485:
486: return true;
487: }//OnInstallCommandCancel
488:
489: //*********************************************************
490: // OnInstallCommandDefault
491: //*********************************************************
492: static
493: INT_PTR
494: OnInstallCommandDefault
495: (
496: HWND hWnd,
497: WPARAM wParam
498: )
499: {
500: // パラメタの仮定
501: ASSERT( IsValidWindow( hWnd ) );
502:
503: {for( int i = 0; i < numof( g_ddx ); ++i )
504: {
505: const int id = LOWORD( wParam );
506:
507: if ( id == g_ddx[ i ].check )
508: return OnInstallCommandCheck( hWnd, wParam );
509: if ( id == g_ddx[ i ].more )
510: return OnInstallCommandMore( hWnd, wParam );
511: }}
512:
513: return false;
514: }//OnInstallCommandDefault
515:
516: //*********************************************************
517: // OnInstallCommandCheck
518: //*********************************************************
519: static
520: INT_PTR
521: OnInstallCommandCheck
522: (
523: HWND hWnd,
524: WPARAM wParam
525: )
526: {
527: // パラメタの仮定
528: ASSERT( IsValidWindow( hWnd ) );
529:
530: //
531: {for( int i = 0; i < numof( g_ddx ); ++i )
532: {
533: if ( g_ddx[ i ].check == LOWORD( wParam ) )
534: {
535: const bool bEnable = (BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ));
536: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, bEnable );
537: return true;
538: }
539: }}
540:
541: UNREACHCODE( "g_ddx の抜け?" );
542: return true;
543: }//OnInstallCommandCheck
544:
545: //*********************************************************
546: // OnInstallCommandMore
547: //*********************************************************
548: static
549: INT_PTR
550: OnInstallCommandMore
551: (
552: HWND hWnd,
553: WPARAM wParam
554: )
555: {
556: // パラメタの仮定
557: ASSERT( IsValidWindow( hWnd ) );
558:
559: //
560: {for( int i = 0; i < numof( g_ddx ); ++i )
561: {
562: if ( g_ddx[ i ].more == LOWORD( wParam ) )
563: {
564: g_dlg.more ^= g_ddx[ i ].flag;
565: VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (g_dlg.more & g_ddx[ i ].flag) ) );
566: return true;
567: }
568: }}
569:
570: UNREACHCODE( "g_ddx の抜け?" );
571: return true;
572: }//OnInstallCommandMore
573:
574:
575: //******************************************************************************************************************
576: // WM_SYSCOMMAND
577: //******************************************************************************************************************
578: static INT_PTR OnInstallSystemCommandSetDefault( HWND hWnd );
579: static INT_PTR OnInstallSystemCommandAbout( HWND hWnd );
580:
581:
582: //*********************************************************
583: // OnInstallSystemCommand - WM_SYSCOMMAND
584: //*********************************************************
585: static
586: INT_PTR
587: OnInstallSystemCommand
588: (
589: HWND hWnd,
590: WPARAM wParam,
591: LPARAM _unuse( lParam )
592: )
593: {
594: // パラメタの仮定
595: ASSERT( IsValidWindow( hWnd ) );
596: ASSERT( IsValidSystemCommandMessageParam( wParam, lParam ) );
597:
598: switch( LOWORD(wParam) )
599: {
600: case IDM_ABOUT: return OnInstallSystemCommandAbout( hWnd );
601: case IDM_SETDEFAULT: return OnInstallSystemCommandSetDefault( hWnd );
602: default: return false;
603: }
604: }//OnInstallSystemCommand
605:
606: //*********************************************************
607: // OnInstallSystemCommandAbout
608: //*********************************************************
609: static
610: INT_PTR
611: OnInstallSystemCommandAbout
612: (
613: HWND hWnd
614: )
615: {
616: // パラメタの仮定
617: ASSERT( IsValidWindow( hWnd ) );
618:
619: ABOUTBOX_t tmp; // AboutBox のパラメータ
620: tmp.url = URL_WEBPAGE;
621: AboutBox( hWnd, &tmp ); // 「……について」ダイアログを表示する。
622:
623: return true;
624: }//OnInstallSystemCommandAbout
625:
626: //*********************************************************
627: // OnInstallSystemCommandSetDefault
628: //*********************************************************
629: static
630: INT_PTR
631: OnInstallSystemCommandSetDefault
632: (
633: HWND hWnd
634: )
635: {
636: // パラメタの仮定
637: ASSERT( IsValidWindow( hWnd ) );
638:
639: VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
640: /*
641: //
642: g_dlg.ico = (FLAG_TILE == (FLAG_TILE & g_dlg.info.flags));
643:
644: // OnInstallSystemCommandUsePif(), InitInstallDlgControls() と重複している!
645: // 関数名を考えよう!
646: if ( g_dlg.ico )
647: {
648: VisibleDlgItem( hWnd, IDC_TILE, true );
649: VisibleDlgItem( hWnd, IDC_MORE_TILE, true );
650: }
651: else
652: {
653: VisibleDlgItem( hWnd, IDC_TILE, false );
654: VisibleDlgItem( hWnd, IDC_MORE_TILE, false );
655:
656: if ( FLAG_TILE == (g_dlg.more & FLAG_TILE) )
657: {
658: g_dlg.more ^= FLAG_TILE;
659: VERIFY( ShowDlgItemGroup( hWnd, ID_TILE, FLAG_TILE == (FLAG_TILE & g_dlg.more) ) );
660: }
661: }
662: */
663:
664: return true;
665: }//OnInstallSystemCommandSetDefault
666:
667:
668: //******************************************************************************************************************
669: // private - init
670: //******************************************************************************************************************
671: //*********************************************************
672: // InitInstallDlgSystemMenu
673: //*********************************************************
674: static
675: bool
676: InitInstallDlgSystemMenu
677: (
678: HWND hWnd
679: )
680: {
681: // パラメタの仮定
682: ASSERT( IsValidWindow( hWnd ) );
683:
684: HMENU hmenuSystem = GetSystemMenu( hWnd, false );
685: const int pos = GetMenuItemPos( hmenuSystem, SC_ZOOM );
686: if ( 0 <= pos )
687: {
688: const struct
689: {
690: UINT type;
691: UINT id;
692: const char *title;
693: }
694: item[] =
695: {
696: #define MAKE_MENUITEM( type, id, title ) { type, id, title }
697: MAKE_MENUITEM( MF_SEPARATOR, 0, null ),
698: MAKE_MENUITEM( MF_STRING, IDM_SETDEFAULT, "設定を初期値に戻す(&D)" ),
699: MAKE_MENUITEM( MF_STRING, IDM_ABOUT, "About(&A)" ),
700: #undef MAKE_MENUITEM
701: };
702: {for( int i = numof( item ); 0 < i; --i )
703: {
704: VERIFY( InsertMenu( hmenuSystem, pos+1, MF_BYPOSITION | item[ i-1 ].type, item[ i-1 ].id, item[ i-1 ].title ) );
705: // Menu_InsertSeparator( hmenuSystem, pos+1, MF_BYPOSITION );
706: }}
707: }
708:
709: return true;
710: }//InitInstallDlgSystemMenu
711:
712:
713: //******************************************************************************************************************
714: // private
715: //******************************************************************************************************************
716: static bool SetInstallDlgDataVerbList( HWND hwndListView, const char *verb );
717:
718:
719: //*********************************************************
720: // ShowDlgItemGroup
721: //*********************************************************
722: static
723: bool
724: ShowDlgItemGroup
725: (
726: HWND hWnd,
727: id_t id,
728: bool bShow
729: )
730: {
731: // パラメタの仮定
732: ASSERT( IsValidWindow( hWnd ) );
733: ASSERT( IS_VALID_ID( id ) );
734:
735: {for( int index = 0; index < numof( g_ddx ); ++index )
736: {
737: if ( id == g_ddx[ index ].id )
738: {
739: //
740: SetDlgItemText( hWnd, g_ddx[ index ].more, bShow ? "<< 詳細" : "詳細 >>" );
741:
742: //
743: {for( int i = 0; i < numof( g_offset ); ++i )
744: {
745: const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
746: if ( (ctrl != g_ddx[ index ].check )
747: && (ctrl != g_ddx[ index ].more) )
748: {
749: if ( IsValidDlgItem( hWnd, ctrl ) )
750: {
751: VisibleDlgItem( hWnd, ctrl, bShow );
752: }
753: }
754: }}
755:
756: //
757: const int sign = bShow ? 1 : -1;
758: const int group_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].group );
759: const int more_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].more );
760: const int height = sign * (group_bottom - more_bottom);
761:
762: //
763: {for( int i = 0; i < numof( g_ddx ); ++i )
764: {
765: if ( i != index )
766: {
767: if ( more_bottom < GetDlgItemTop( hWnd, g_ddx[ i ].group ) )
768: {
769: {for( int j = 0; j < numof( g_offset ); ++j )
770: {
771: const int ctrl = atoffset( int, &g_ddx[ i ], g_offset[ j ] );
772: if ( IsValidDlgItem( hWnd, ctrl ) )
773: {
774: ShiftDlgItemPos( hWnd, ctrl, 0, height );
775: }
776: }}
777: }
778: }
779: }}
780:
781: //
782: ShiftDlgItemPos( hWnd, IDOK, 0, height );
783: ShiftDlgItemPos( hWnd, IDCANCEL, 0, height );
784:
785: //
786: g_dlg.szMinSize.cy += height;
787: ShiftWindowSize( hWnd, 0, height );
788: }
789: }}
790:
791: return true;
792: }//ShowDlgItemGroup
793:
794: //*********************************************************
795: // EnableDlgItemGroup
796: //*********************************************************
797: static
798: bool
799: EnableDlgItemGroup
800: (
801: HWND hWnd,
802: id_t id,
803: bool bEnable
804: )
805: {
806: // パラメタの仮定
807: ASSERT( IsValidWindow( hWnd ) );
808: ASSERT( IS_VALID_ID( id ) );
809:
810: //
811: {for( int index = 0; index < numof( g_ddx ); ++index )
812: {
813: if ( id == g_ddx[ index ].id )
814: {
815: {for( int i = 0; i < numof( g_offset ); ++i )
816: {
817: const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
818: if ( (ctrl != g_ddx[ index ].check )
819: && (ctrl != g_ddx[ index ].more) )
820: {
821: if ( IsValidDlgItem( hWnd, ctrl ) )
822: {
823: EnableDlgItem( hWnd, ctrl, bEnable );
824: }
825: }
826: }}
827: }
828: }}
829:
830: return true;
831: }//EnableDlgItemGroup
832:
833: //*********************************************************
834: // GetInstallDlgData
835: //*********************************************************
836: static
837: bool
838: GetInstallDlgData
839: (
840: HWND hWnd,
841: install_t *info
842: )
843: {
844: // パラメタの仮定
845: ASSERT( IsValidWindow( hWnd ) );
846: ASSERT( IsValidPtr( info, sizeof( *info ) ) );
847: DESTROY_BUFFER( info, sizeof( *info ) ); // [破壊]
848:
849: // 関連づけ
850: info->flags = 0;
851: {for( int i = 0; i < numof( g_ddx ); ++i )
852: {
853: // check
854: if ( IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
855: {
856: if ( BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ) )
857: {
858: info->flags |= g_ddx[ i ].flag;
859: }
860: }
861:
862: //
863: {
864: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
865: const size_t index = ID_INDEX( g_ddx[ i ].id );
866: ASSERT( IS_VALID_INDEX( index ) );
867: relation_t *reg = &info->reg[ index ];
868:
869: // default
870: strcopy( reg->menu, numof(reg->menu), g_dlg.info.reg[ index ].menu );
871: strcopy( reg->cmdline, numof(reg->cmdline), g_dlg.info.reg[ index ].cmdline );
872: strcopy( reg->regpath, numof(reg->regpath), g_dlg.info.reg[ index ].regpath );
873:
874: // regpath
875: /* if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
876: {
877: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath, numof( reg->regpath ) ) );
878: }
879: // ASSERT( IsValidRegistryPathString( reg->regpath ) );*/
880:
881: // menu
882: if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
883: {
884: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu, numof( reg->menu ) ) );
885: }
886: ASSERT( IsValidStringPtr( reg->menu ) );
887:
888: // cmdline
889: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
890: {
891: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline, numof( reg->cmdline ) ) );
892: }
893: ASSERT( IsValidCommandLineString( reg->cmdline ) );
894: }
895: }}
896:
897:
898: ASSERT( IsValidInstallInfo( info ) );
899: return true;
900: }//GetInstallDlgData
901:
902: //*********************************************************
903: // SetInstallDlgData
904: //*********************************************************
905: static
906: bool
907: SetInstallDlgData
908: (
909: HWND hWnd,
910: const install_t *info
911: )
912: {
913: // パラメタの仮定
914: ASSERT( IsValidWindow( hWnd ) );
915: ASSERT( IsValidInstallInfo( info ) );
916:
917: //
918: {for( int i = 0; i < numof( g_ddx ); ++i )
919: {
920: // check
921: const UINT uCheck = (g_ddx[ i ].flag == (info->flags & g_ddx[ i ].flag)) ? BST_CHECKED : BST_UNCHECKED;
922: if ( ! IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
923: {
924: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, false );
925: }
926: else
927: {
928: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, BST_CHECKED == uCheck );
929: CheckDlgButton( hWnd, g_ddx[ i ].check, uCheck );
930: }
931:
932: //
933: {
934: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
935: const size_t index = ID_INDEX( g_ddx[ i ].id );
936: ASSERT( IS_VALID_INDEX( index ) );
937: const relation_t *reg = &info->reg[ index ];
938: // ASSERT( IsValidRegistryPathString( reg->regpath ) );
939: ASSERT( IsValidCommandLineString( reg->cmdline ) );
940: ASSERT( IsValidStringPtr( reg->menu ) );
941:
942: // regpath
943: /* if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
944: {
945: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath ) );
946: }*/
947:
948: // menu
949: if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
950: {
951: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu ) );
952: }
953:
954: // cmdline
955: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
956: {
957: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline ) );
958: }
959: }
960: }}
961:
962: return true;
963: }//SetInstallDlgData
964:
965:
966: //******************************************************************************************************************
967: // private - init controls
968: //******************************************************************************************************************
969: //*********************************************************
970: // InitInstallDlgControls
971: //*********************************************************
972: static
973: bool
974: InitInstallDlgControls
975: (
976: HWND hWnd,
977: DWORD more
978: )
979: {
980: // パラメタの仮定
981: ASSERT( IsValidWindow( hWnd ) );
982:
983: //
984: {for( int i = 0; i < numof( g_ddx ); ++i )
985: {
986: VERIFY( VisibleDlgItem( hWnd, g_ddx[ i ].more, false ) );
987: VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (more & g_ddx[ i ].flag) ) );
988: }}
989: /*
990: // OnInstallSystemCommandUsePif(), OnInstallSystemCommandSetDefault() と重複している!
991: // 関数名を考えよう!
992: if ( g_dlg.ico )
993: {
994: VisibleDlgItem( hWnd, IDC_TILE, true );
995: VisibleDlgItem( hWnd, IDC_MORE_TILE, true );
996: }
997: else
998: {
999: VisibleDlgItem( hWnd, IDC_TILE, false );
1000: VisibleDlgItem( hWnd, IDC_MORE_TILE, false );
1001:
1002: if ( FLAG_TILE == (g_dlg.more & FLAG_TILE) )
1003: {
1004: g_dlg.more ^= FLAG_TILE;
1005: VERIFY( ShowDlgItemGroup( hWnd, ID_TILE, FLAG_TILE == (FLAG_TILE & g_dlg.more) ) );
1006: }
1007: }
1008: */
1009:
1010: return true;
1011: }//InitInstallDlgControls
1012:
1013:
1014:
1015: //******************************************************************************************************************
1016: // TEST
1017: //******************************************************************************************************************
1018:
1019:
1020: #ifdef _DEBUG // デバッグ時のみ
1021:
1022:
1023: //*********************************************************
1024: // test_InstallDlg
1025: //*********************************************************
1026: DEFINE_TESTPROC( test_InstallDlg )
1027: {
1028: //---------------------------------------------------------
1029: // 定数 の テスト
1030: //---------------------------------------------------------
1031:
1032: // g_offset の 重複
1033: {for( int i = 0; i < numof( g_offset ) - 1; ++i )
1034: {
1035: {for( int j = i+1; j < numof( g_offset ); ++j )
1036: {
1037: ASSERT( i != j );
1038: ASSERT( g_offset[ i ] != g_offset[ j ] );
1039: }}
1040: }}
1041:
1042: // g_ddx の 範囲
1043: {for( int i = 0; i < numof( g_ddx ); ++i )
1044: {
1045: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1046: // ASSERT( (0 <= g_ddx[i].id) && (g_ddx[i].id < numof( ((install_t *)null)->reg )) );
1047: }}
1048:
1049: // g_ddx の 重複
1050: {for( int i = 0; i < numof( g_ddx ) - 1; ++i )
1051: {
1052: {for( int j = i+1; j < numof( g_ddx ); ++j )
1053: {
1054: ASSERT( i != j );
1055: ASSERT( g_ddx[ i ].id != g_ddx[ j ].id );
1056: ASSERT( 0 == (g_ddx[ i ].flag & g_ddx[ j ].flag) );
1057:
1058: {for( int k = 0; k < numof( g_offset ); ++k )
1059: {
1060: const int ctrl_i = atoffset( int, &g_ddx[ i ], g_offset[ k ] );
1061: const int ctrl_j = atoffset( int, &g_ddx[ j ], g_offset[ k ] );
1062: ASSERT( ctrl_i != ctrl_j );
1063: }}
1064: }}
1065: }}
1066:
1067:
1068: //---------------------------------------------------------
1069: // ファイルスコープ関数 の テスト
1070: //---------------------------------------------------------
1071:
1072: //---------------------------------------------------------
1073: // 公開関数 の テスト
1074: //---------------------------------------------------------
1075:
1076: }//test_InstallDlg
1077:
1078:
1079: #endif // #ifdef _DEBUG
1080:
1081:
1082: //** end **
参照:
水無瀬の部屋 > sample > goddess > instdlg.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/goddess/instdlg_cpp.shtml
同人ダウンロード販売|DL.Getchu.com